package com.atguigu.gmall.realtime.utils;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * Author: tiancy
 * Date: 2021/12/1
 * Desc: 线程池工具类
 *  双重校验锁  解决单例设计模式懒汉式线程安全问题
 */
public class ThreadPoolUtil {
    private static ThreadPoolExecutor pool;

    //获取单例线程池对象
    public static ThreadPoolExecutor getInstance(){
        if(pool == null){
            /*
                这里加入双重判断的原因 : 如果开始判断当前 pool对象是空的,校验通过(这时另一个线程抢到了执行权限,创建了pool这个对象).
                因此我当前线程再继续执行的时候,需要再次判断当前`pool`对象是否是空.再考虑要不要创建线程池
             */

            synchronized (ThreadPoolUtil.class){
                if(pool == null){
                    System.out.println("---创建线程池对象---");
                    pool = new ThreadPoolExecutor(4,20,300,
                        TimeUnit.SECONDS,new LinkedBlockingDeque<Runnable>(Integer.MAX_VALUE));
                }
            }
        }

        return pool;
    }
}